package com.roan.alipay.dto;

import lombok.Data;

import java.util.List;

/**
 * 支付宝支付请求参数
 * @author Roan
 * @date 2025/4/26 18:18
 */
@Data
public class AlipayInitPaymentRequest {
    /**
     * 商户订单号（64字符内，字母/数字/下划线，商户端唯一）
     */
    private String outTradeNo;

    /**
     * 订单总金额（单位元，精确到0.01，范围[0.01,100000000]）
     */
    private String totalAmount;

    /**
     * 订单标题（256字符内，不能含特殊字符如/=&等）
     */
    private String subject;

    /**
     * 销售产品码（电脑支付场景固定为FAST_INSTANT_TRADE_PAY）
     */
    private String productCode;

    /**
     * PC扫码支付方式：
     * 0-简约前置模式(600x300)
     * 1-前置模式(300x600)
     * 3-迷你前置模式(75x75)
     * 4-自定义二维码
     * 2-跳转模式
     */
    private String qrPayMode;

    /**
     * 自定义二维码宽度（qrPayMode=4时有效）
     */
    private Integer qrcodeWidth;

    /**
     * 商品明细列表
     */
    private List<GoodsDetail> goodsDetail;

    /**
     * 订单绝对超时时间（格式yyyy-MM-dd HH:mm:ss，范围1分钟~15天）
     */
    private String timeExpire;

    /**
     * 二级商户信息（间连业务必传）
     */
    private SubMerchant subMerchant;

    /**
     * 业务扩展参数
     */
    private ExtendParams extendParams;

    /**
     * 商户门店编号
     */
    private String storeId;

    /**
     * 商户原始订单号（最大32位）
     */
    private String merchantOrderNo;

    /**
     * 外部指定买家信息
     */
    private ExtUserInfo extUserInfo;

    /**
     * 开票信息
     */
    private InvoiceInfo invoiceInfo;


    /**
     * 商品明细
     */
    @Data
    public static class GoodsDetail {
        /**
         * 商品编号（64字符内）
         */
        private String goodsId;

        /**
         * 商品名称（256字符内）
         */
        private String goodsName;

        /**
         * 商品数量
         */
        private Integer quantity;

        /**
         * 商品单价（单位元）
         */
        private String price;

        /**
         * 支付宝统一商品编号（32字符内）
         */
        private String alipayGoodsId;

        /**
         * 商品类目（24字符内）
         */
        private String goodsCategory;

        /**
         * 商品类目树（128字符内，类目ID用|分隔）
         */
        private String categoriesTree;

        /**
         * 商品展示URL（400字符内）
         */
        private String showUrl;
    }

    /**
     * 二级商户信息
     */
    @Data
    public static class SubMerchant {
        /**
         * 间连商户支付宝编号（16字符）
         */
        private String merchantId;

        /**
         * 二级商户编号类型（默认alipay）
         */
        private String merchantType;
    }

    /**
     * 业务扩展参数
     */
    @Data
    public static class ExtendParams {
        /**
         * 系统商编号（返佣依据）
         */
        private String sysServiceProviderId;

        /**
         * 花呗分期数（5字符内）
         */
        private String hbFqNum;

        /**
         * 花呗分期卖家承担比例（100表示100%）
         */
        private String hbFqSellerPercent;

        /**
         * 行业数据回流信息（512字符内）
         */
        private String industryRefluxInfo;

        /**
         * 卡类型（如S0JP0000）
         */
        private String cardType;

        /**
         * 是否资金冻结（用于后续分账）
         */
        private String royaltyFreeze;

        /**
         * 业务信息JSON（与支付宝约定）
         */
        private String businessParams;

        /**
         * 优惠参数JSON
         */
        private String promoParams;

        /**
         * 页面集成方式（ALIAPP/PCWEB）
         */
        private String integrationType;

        /**
         * 请求来源地址（256字符内）
         */
        private String requestFromUrl;
    }

    /**
     * 外部买家信息
     */
    @Data
    public static class ExtUserInfo {
        /**
         * 买家证件号（64字符内）
         */
        private String certNo;

        /**
         * 允许的最小买家年龄（≥0的整数）
         */
        private String minAge;

        /**
         * 指定买家姓名（16字符内）
         */
        private String name;

        /**
         * 指定买家手机号（20字符内）
         */
        private String mobile;

        /**
         * 证件类型：
         * IDENTITY_CARD-身份证
         * PASSPORT-护照
         * OFFICER_CARD-军官证
         * SOLDIER_CARD-士兵证
         * HOKOU-户口本
         */
        private String certType;

        /**
         * 是否强制校验买家信息（T/F）
         */
        private String needCheckInfo;

        /**
         * 买家加密身份信息（sha256哈希）
         */
        private String identityHash;
    }

    /**
     * 开票信息
     */
    @Data
    public static class InvoiceInfo {
        /**
         * 开票关键信息（200字符内）
         */
        private String keyInfo;

        /**
         * 开票内容（JSON数组格式，400字符内）
         */
        private String details;
    }
}
